package com.llb666.java.leetcode.node;

import com.llb666.java.leetcode.node.链表反转.ListNode;
import lombok.extern.slf4j.Slf4j;

/**
 * 给你一个单链表的引用结点head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。
 * 请你返回该链表所表示数字的 十进制值 。
 *
 * @author liulibin
 * @date 2021/7/8 10:48
 */
@Slf4j
public class 二进制链表转整数 {

    public static void main(String[] args) {
      /* 1110 二进制 0*2+1  -> 1*2+1 ->3*2+1 ->7*2+0 =14
         1110 十进制 0*10+1 -> 1*10+1 ->11*10+1 ->111*10+10 = 1110
         1234 十进制 0*10+1 -> 1*10+2 ->12*10+3 ->123*10+4 =1234
         head [1,0,1] : 二进制101 = 1*2^2 +0*2^1 +1*2^0 = 5
         head [1,0,1] : 二进制101 = 0*2+1 -> 1*2+0 -> 2*2+1 =5
      */

//        ListNode node2 = new ListNode(1,null);
//        ListNode node1 = new ListNode(0,node2);
//        ListNode head = new ListNode(1,node1);
//        int decimalValue = getDecimalValue(head);
//        log.info("二进制转整数结果是：{}",decimalValue);

        System.out.println(getTenValue(101));
        System.out.println(getTwoValue(5));
    }

    /**
     * 二进制链表转整数
     *
     * @param head 单链表的引用结点head
     * @return 该链表所表示数字的 十进制值 。
     */
    public static int getDecimalValue(ListNode head) {
        int r = 0;
        for (; head != null; head = head.next) {
            // 乘以2 再做或运算，由于都是0和1，或运算就是+1或者+0
            r = (r << 1) | head.val;
        }
        return r;
    }

    //拓展 二进制转10进制
    public static Integer getTenValue(int value) {
        char[] array = String.valueOf(value).toCharArray();
        int r = 0;
        for (char arr : array) {
            int intArr = Integer.parseInt(arr + "");
            r = (r << 1) | intArr;
        }
        return r;
    }

    //拓展 10进制转2进制
    public static Integer getTwoValue(int n) {
        String str = "";
        while (n != 0) {
            str = n % 2 + str;
            n = n / 2;
        }
        return Integer.valueOf(str);
    }
}
